package com.myworld.config.httpClient;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@Service("httpClientApiService")
public class HttpClientApiServiceImpl implements HttpClientApiService{  
	private final static Logger logger=LoggerFactory.getLogger(HttpClientApiServiceImpl.class);
    @Autowired  
    private CloseableHttpClient httpClient;  
    @Autowired  
    private RequestConfig requestConfig;  
  
    /** 
     * 执行get请求,200返回响应内容，其他状态码返回null 
     * 
     * @param url 
     * @return 
     * @throws IOException 
     */  
    public String doGet(String url) throws IOException {  
        //创建httpClient对象  
        CloseableHttpResponse response = null;  
        HttpGet httpGet = new HttpGet(url);  
        //设置请求参数  
        httpGet.setConfig(requestConfig);  
        
        try {  
            //执行请求  
            response = httpClient.execute(httpGet);  
            //判断返回状态码是否为200  
            if (response.getStatusLine().getStatusCode() == 200) {  
                return EntityUtils.toString(response.getEntity(), "UTF-8");  
            }  
        } finally {  
            if (response != null) {  
                response.close();  
            }  
        }  
        return null;  
    }  
    @Override
	public HttpResult doPost(String url, Map<String,String> parameters) throws ClientProtocolException, IOException {
    	// 创建http POST请求  
        HttpPost httpPost =new HttpPost(url);
        httpPost.setConfig(this.requestConfig);
        List<NameValuePair> pairs = new ArrayList<NameValuePair>();
        for(Entry<String,String> entry : parameters.entrySet())
        {
             pairs.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));
        }
        httpPost.setEntity(new UrlEncodedFormEntity(pairs,"UTF-8"));//加入参数
        CloseableHttpResponse response = null;  
        HttpResult httpResult=null;
        try {  
            //执行请求  
            response = httpClient.execute(httpPost);
            logger.info("请求接口->doPost->:"+url+",statusCode:"+response.getStatusLine().getStatusCode());
            //判断返回状态码是否为200  
            if (response.getStatusLine().getStatusCode() == 200) {  
            	String responseStr=EntityUtils.toString(response.getEntity(), "UTF-8");
            	httpResult=new HttpResult(200, responseStr);
            }else{
            	httpResult=new HttpResult(response.getStatusLine().getStatusCode(), null);
            }
        } finally {  
            if (response != null) {  
                response.close();  
            }  
        }  
        return httpResult;
	}
  
    /** 
     * 执行带有参数的get请求 
     * 
     * @param url 
     * @param paramMap 
     * @return 
     * @throws IOException 
     * @throws URISyntaxException 
     */  
    public String doGet(String url, Map<String, String> paramMap) throws IOException, URISyntaxException {  
        URIBuilder builder = new URIBuilder(url);  
        for (String s : paramMap.keySet()) {  
            builder.addParameter(s, paramMap.get(s));  
        }  
        return doGet(builder.build().toString());  
    }  
  
  
    /** 
     * 执行post请求 
     * 
     * @param url 
     * @return 
     * @throws IOException 
     */  
    public HttpResult doPost(String url) throws IOException {  
        return doPostJson(url, null);  
    }  
  
  
    /** 
     * 提交json数据 
     * 
     * @param url 
     * @param json 
     * @return 
     * @throws ClientProtocolException 
     * @throws IOException 
     */  
    public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException {  
        // 创建http POST请求  
        HttpPost httpPost = new HttpPost(url);  
        httpPost.setConfig(this.requestConfig);  
  
        if (json != null) {  
            // 构造一个请求实体  
            StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);  
            // 将请求实体设置到httpPost对象中  
            httpPost.setEntity(stringEntity);  
        }  
        CloseableHttpResponse response = null;  
        try {  
            // 执行请求  
            response = this.httpClient.execute(httpPost);  
            return new HttpResult(response.getStatusLine().getStatusCode(),  
                    EntityUtils.toString(response.getEntity(), "UTF-8"));  
        }catch(Exception e){
        	e.printStackTrace();
        	  return new HttpResult(400,"");
        }
        
        finally {  
            if (response != null) {  
                response.close();  
            }  
        }  
       
    }  
    /** 
     * 提交json数据 
     * 
     * @param url 
     * @param json 
     * @param header 额外添加的协议头
     * @return 
     * @throws ClientProtocolException 
     * @throws IOException 
     */  
    @Override
    public HttpResult doPostJson(String url, String json,Map<String,String> header) throws ClientProtocolException, IOException {  
        // 创建http POST请求  
        HttpPost httpPost = new HttpPost(url);  
        httpPost.setConfig(this.requestConfig);  
  
        if (json != null) {  
            // 构造一个请求实体  
            StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);  
            // 将请求实体设置到httpPost对象中  
            httpPost.setEntity(stringEntity);  
            //添加额外的协议头
            if(null!=header){
            	Set<Entry<String, String>>  headerEntrySet=header.entrySet();
            	for(Entry<String, String> e:headerEntrySet){
            		httpPost.addHeader(e.getKey(), e.getValue());
            	}
            }
        }  
        CloseableHttpResponse response = null;  
        try {  
            // 执行请求  
            response = this.httpClient.execute(httpPost);  
            return new HttpResult(response.getStatusLine().getStatusCode(),  
                    EntityUtils.toString(response.getEntity(), "UTF-8"));  
        }catch(Exception e){
        	e.printStackTrace();
        	  return new HttpResult(400,"");
        }
        
        finally {  
            if (response != null) {  
                response.close();  
            }  
        }  
       
    }

}
